package com.knowledge.plus.java8.函数式接口;

import java.util.Arrays;
import java.util.List;
import java.util.function.IntPredicate;
import java.util.function.Predicate;

/**
 * Predicate<T> 断定型接口：接受一个输入参数，返回一个布尔值结果
 * 这个接口通常用于判断某个对象是否满足某个条件，或者在流（Stream）操作中作为过滤条件
 * -
 * 示例：{@link com.easy.utils.StreamUtilsTests#predicateTest()}
 *
 * @author TPF
 * @since 2023/12/5
 */
class PredicateDemo {

    public static void main(String[] args) {
        /*
         * 示例1：
         */
        Predicate<Integer> isEven = n -> n % 2 == 0;
        boolean isTwoEven = isEven.test(2); // 返回 true

        /*
         * 示例2：
         */
        List<Integer> integers = Arrays.asList(1, 2, 4, 5, 6, 7);
        calculate(v -> v % 2 == 0, integers);

        /*
         * 示例3：
         */
        boolean result = judge("asvrvrc", str -> str.length() > 5, str -> str.contains("a"));
        System.out.println(result);

        /*
         * 示例4：匿名内部类
         * 输出结果：2	4	6	8	10
         */
        printNum(new IntPredicate() {
            @Override
            public boolean test(int value) {
                return value % 2 == 0;
            }
        });
    }

    /**
     * @param predicate 函数式参数
     */
    private static void calculate(Predicate<Integer> predicate, List<Integer> list) {
        for (Integer integer : list) {
            boolean test = predicate.test(integer);
            System.out.println(integer + " 是偶数? " + test);
        }
    }

    /**
     * boolean test(T t) ：用来对指定数据类型数据进行判断的方法
     * and：表示并且关系，也可以用于连接两个判断条件
     * or：表示或者关系，也可以用于连接两个判断条件
     * negate：表示取反关系
     */
    private static boolean judge(String str, Predicate<String> pre1, Predicate<String> pre2) {
        // return pre1.test(str) && pre2.test(str);
        return pre1.and(pre2).test(str); // 等同于上边的代码
    }

    private static void printNum(IntPredicate predicate) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i : arr) {
            if (predicate.test(i)) {
                System.out.print(i + "\t");
            }
        }
    }

}
